// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 22/03/2011 12:29:56 p.m.
// Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   CFDPrintServices_old.java

package com.luxsoft.sw3.impap.services;

import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.swing.EventTableModel;
import com.jgoodies.uif.util.ScreenUtils;
import com.luxsoft.siipap.cxc.model.FormaDePago;
import com.luxsoft.siipap.cxc.model.NotaDeCargo;
import com.luxsoft.siipap.cxc.model.OrigenDeOperacion;
import com.luxsoft.siipap.cxc.old.ImporteALetra;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.UserLog;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.swing.reports.ReportUtils;
import com.luxsoft.siipap.swing.utils.MessageUtils;
import com.luxsoft.siipap.swing.utils.SWExtUIManager;
import com.luxsoft.siipap.util.MonedasUtils;
import com.luxsoft.siipap.ventas.model.Asociado;
import com.luxsoft.siipap.ventas.model.Cobrador;
import com.luxsoft.siipap.ventas.model.Vendedor;
import com.luxsoft.siipap.ventas.model.Venta;
import com.luxsoft.siipap.ventas.service.VentasManager;
import com.luxsoft.sw3.cfd.CFDUtils;
import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;
import com.luxsoft.sw3.cfd.services.ComprobantesDigitalesManager;
import java.awt.Dimension;
import java.io.PrintStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.SwingUtilities;
import mx.gob.sat.cfd.x2.ComprobanteDocument;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRTableModelDataSource;
import net.sf.jasperreports.view.JRViewer;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

// Referenced classes of package com.luxsoft.sw3.impap.services:
//            ReportDialog

public class CFDPrintServices_old
{

    public CFDPrintServices_old()
    {
    }

    public static void imprimirFacturaElectronica(String facturaId, boolean printPreview, String destinatarios[])
    {
        Venta venta = buscarVenta(facturaId);
        String as[];
        int j = (as = destinatarios).length;
        for(int i = 0; i < j; i++)
        {
            String destinatario = as[i];
            impripirComprobante(venta, null, destinatario, printPreview);
        }

    }

    public static void impripirComprobante(Venta venta, ComprobanteFiscal cf, String destinatario, boolean printPreview)
    {
        ca.odell.glazedlists.EventList conceptos = GlazedLists.eventList(venta.getPartidas());
        Map parametros = resolverParametros(venta, cf);
        parametros.put("DESTINATARIO", destinatario);
        net.sf.jasperreports.engine.JasperPrint jasperPrint = null;
        DefaultResourceLoader loader = new DefaultResourceLoader();
        Resource res = loader.getResource(ReportUtils.toReportesPath("ventas/FacturaDigitalImpap.jasper"));
        System.out.println((new StringBuilder("Generando impresion de CFD con parametros: ")).append(parametros).toString());
        try
        {
            java.io.InputStream io = res.getInputStream();
            String columnas[] = {
                "cantidadEnUnidad", "clave", "descripcion", "producto.kilos", "producto.gramos", "precio", "importe", "instruccionesDecorte", "producto.modoDeVenta", "clave", 
                "producto.modoDeVenta", "producto.unidad.unidad", "ordenp", "precioConIva", "importeConIva", "pedimento", "pedimentoFecha", "aduana"
            };
            String etiquetas[] = {
                "CANTIDAD", "CLAVE", "DESCRIPCION", "KXM", "GRAMOS", "PRECIO", "IMPORTE", "CORTES_INSTRUCCION", "MDV", "GRUPO", 
                "MDV", "UNIDAD", "ORDENP", "PRECIO_IVA", "IMPORTE_IVA", "PEDIMENTO", "PEDIMENTO_FECHA", "ADUANA"
            };
            ca.odell.glazedlists.gui.TableFormat tf = GlazedLists.tableFormat(columnas, etiquetas);
            EventTableModel tableModel = new EventTableModel(conceptos, tf);
            JRTableModelDataSource tmDataSource = new JRTableModelDataSource(tableModel);
            jasperPrint = JasperFillManager.fillReport(io, parametros, tmDataSource);
            if(printPreview)
            {
                JRViewer jasperViewer = new JRViewer(jasperPrint);
                jasperViewer.setPreferredSize(new Dimension(900, 1000));
                ReportDialog dialog = new ReportDialog(jasperViewer, "Factura digital", false);
                ScreenUtils.locateOnScreenCenter(dialog);
                dialog.open();
            } else
            {
                JasperPrintManager.printReport(jasperPrint, false);
            }
        }
        catch(Exception ioe)
        {
            ioe.printStackTrace();
            MessageUtils.showError("Error imprimiendo CFD", ioe);
            return;
        }
    }

    public static Map resolverParametros(Venta venta, ComprobanteFiscal cf)
    {
        if(cf == null)
            cf = buscarComprobante(venta.getId());
        cf.loadComprobante();
        mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante comprobante = cf.getComprobante();
        Map parametros = new HashMap();
        parametros.put("FOLIO", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append("-").append(comprobante.getFolio()).toString());
        parametros.put("ANO_APROBACION", Integer.valueOf(comprobante.getAnoAprobacion()));
        parametros.put("NO_APROBACION", Integer.valueOf(comprobante.getNoAprobacion().intValue()));
        parametros.put("NUM_CERTIFICADO", comprobante.getNoCertificado());
        parametros.put("SELLO_DIGITAL", comprobante.getSello());
        parametros.put("CADENA_ORIGINAL", getCadenaOriginal(cf.getComprobanteDocument()));
        parametros.put("NOMBRE", comprobante.getReceptor().getNombre());
        parametros.put("RFC", comprobante.getReceptor().getRfc());
        parametros.put("FECHA", comprobante.getFecha().getTime());
        parametros.put("NFISCAL", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append(" - ").append(comprobante.getFolio()).toString());
        parametros.put("IMPORTE", comprobante.getSubTotal());
        parametros.put("IMPUESTO", comprobante.getImpuestos().getTotalImpuestosTrasladados());
        parametros.put("TOTAL", comprobante.getTotal());
        parametros.put("DIRECCION", CFDUtils.getDireccionEnFormatoEstandar(comprobante.getReceptor().getDomicilio()));
        parametros.put("CARGO_ID", venta.getId());
        parametros.put("IMP_CON_LETRA", ImporteALetra.aLetra(venta.getTotalCM()));
        parametros.put("SUCURSAL", venta.getSucursal().getId());
        parametros.put("CLAVCTE", venta.getClave());
        parametros.put("SUC", Integer.valueOf(venta.getSucursal().getClave()));
        parametros.put("TEL", venta.getCliente().getTelefonosRow());
        parametros.put("D_REV", Integer.valueOf(venta.getDiaRevision()));
        parametros.put("D_PAG", Integer.valueOf(venta.getDiaDelPago()));
        parametros.put("COB", venta.getCobrador() == null ? null : ((Object) (venta.getCobrador().getId())));
        parametros.put("VEND", venta.getVendedor() == null ? null : ((Object) (venta.getVendedor().getId())));
        parametros.put("PLAZO", Integer.valueOf(venta.getPlazo()));
        parametros.put("FREV", venta.isRevision() ? "R" : "");
        parametros.put("SOCIO", venta.getSocio() == null ? null : ((Object) (venta.getSocio().getNombre())));
        parametros.put("TIPO", venta.getOrigen().equals(OrigenDeOperacion.CRE) ? "CREDITO" : "CONTADO");
        parametros.put("DOCTO", venta.getDocumento());
        parametros.put("TAR_COM_IMP", venta.getCargos());
        parametros.put("COMENTARIO", venta.getComentario());
        parametros.put("PCE", venta.isContraEntrega() ? "COD" : "PAGADO CON");
        parametros.put("ENVIO", venta.getPedidoFormaDeEntrega().equals("LOCAL") ? "PASAN" : "ENVIO");
        parametros.put("PEDIDO", venta.getPedidoFolio());
        parametros.put("IP", venta.getPedidoCreatedIp());
        parametros.put("ELAB_VTA", venta.getPedidoCreateUser());
        parametros.put("PUESTO", venta.getPuesto().booleanValue() ? "**PUESTO**" : "");
        parametros.put("DIR_ENTREGA", venta.getMisma().booleanValue() ? "***MISMA***" : ((Object) (venta.getInstruccionDeEntrega())));
        if(venta.getSocio() != null && venta.getMisma().booleanValue())
            parametros.put("DIR_ENTREGA", venta.getSocio().getDireccion());
        parametros.put("KILOS", venta.getKilos());
        parametros.put("IMP_DESC", venta.getSubTotal2());
        parametros.put("CORTES", venta.getImporteCortes());
        parametros.put("FLETE", venta.getFlete());
        parametros.put("CARGOS", venta.getCargos());
        parametros.put("FPAGO", venta.getFormaDePago().name());
        parametros.put("ELAB_FAC", venta.getLog().getCreateUser());
        parametros.put("SURTIDOR", venta.getSurtidor());
        parametros.put("IMPORTE_BRUTO", venta.getImporteBruto());
        parametros.put("SUBTOTAL_2", venta.getImporteBruto().subtract(venta.getImporteDescuento()));
        parametros.put("DESCUENTO", BigDecimal.valueOf(venta.getDescuentoGlobal()));
        parametros.put("DESCUENTOS", venta.getImporteDescuento());
        parametros.put("PINT_IVA", MonedasUtils.IVA.multiply(BigDecimal.valueOf(100L)));
        parametros.put("TIPOX", venta.getOrigen().equals(OrigenDeOperacion.CRE) ? "CREDITO" : "CONTADO");
        if(venta.getClave().equals("1"))
        {
            CantidadMonetaria factor = CantidadMonetaria.pesos(1.0D).add(CantidadMonetaria.pesos(MonedasUtils.IVA));
            parametros.put("IMPORTE_BRUTO", factor.multiply(venta.getImporteBruto()).amount());
            parametros.put("DESCUENTOS", factor.multiply(venta.getImporteDescuento()).amount());
            parametros.put("SUBTOTAL_2", factor.multiply(venta.getImporteBruto().subtract(venta.getImporteDescuento())).amount());
            parametros.put("IMP_DESC", factor.multiply(venta.getSubTotal2()).amount());
            parametros.put("CORTES", factor.multiply(venta.getImporteCortes()).amount());
            parametros.put("FLETE", factor.multiply(venta.getFlete()).amount());
            parametros.put("CARGOS", factor.multiply(venta.getCargos()).amount());
            parametros.put("IMPORTE", comprobante.getTotal());
        }
        return parametros;
    }

    public static Venta buscarVenta(String ventaId)
    {
        return ServiceLocator2.getVentasManager().buscarVentaInicializada(ventaId);
    }

    public static ComprobanteFiscal buscarComprobante(String origenId)
    {
        String hql = "from ComprobanteFiscal c where c.origen=?";
        return (ComprobanteFiscal)ServiceLocator2.getHibernateTemplate().find(hql, origenId).iterator().next();
    }

    public static String getCadenaOriginal(ComprobanteDocument document)
    {
        return ServiceLocator2.getCFDManager().generarCadenaOriginal(document);
    }

    public static void imprimirNotaDeCargoElectronica(String notaDeCargoId)
    {
        NotaDeCargo nota = buscarNotaInicializada(notaDeCargoId);
        if(nota == null)
            return;
        ComprobanteFiscal cf = buscarComprobante(nota.getId());
        cf.loadComprobante();
        java.util.List conceptosArray = Arrays.asList(cf.getComprobante().getConceptos().getConceptoArray());
        ca.odell.glazedlists.EventList conceptos = GlazedLists.eventList(conceptosArray);
        Map parametros = resolverParametros(nota, null);
        net.sf.jasperreports.engine.JasperPrint jasperPrint = null;
        DefaultResourceLoader loader = new DefaultResourceLoader();
        Resource res = loader.getResource(ReportUtils.toReportesPath("cxc/NotaCarDigitalImpap.jasper"));
        System.out.println((new StringBuilder("Generando impresion de CFD con parametros: ")).append(parametros).toString());
        try
        {
            java.io.InputStream io = res.getInputStream();
            String columnas[] = {
                "cantidad", "descripcion", "valorUnitario", "importe", "descripcion"
            };
            String etiquetas[] = {
                "CANTIDAD", "DESCRIPCION", "PRECIO", "IMPORTE", "GRUPO"
            };
            ca.odell.glazedlists.gui.TableFormat tf = GlazedLists.tableFormat(columnas, etiquetas);
            EventTableModel tableModel = new EventTableModel(conceptos, tf);
            JRTableModelDataSource tmDataSource = new JRTableModelDataSource(tableModel);
            jasperPrint = JasperFillManager.fillReport(io, parametros, tmDataSource);
            JRViewer jasperViewer = new JRViewer(jasperPrint);
            jasperViewer.setPreferredSize(new Dimension(900, 1000));
            ReportDialog dialog = new ReportDialog(jasperViewer, "Nota de cargo digital", false);
            ScreenUtils.locateOnScreenCenter(dialog);
            dialog.open();
        }
        catch(Exception ioe)
        {
            ioe.printStackTrace();
            MessageUtils.showError("Error imprimiendo CFD", ioe);
            return;
        }
    }

    private static NotaDeCargo buscarNotaInicializada(final String id)
    {
        return (NotaDeCargo)ServiceLocator2.getHibernateTemplate().execute(new HibernateCallback() {

            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                NotaDeCargo res = (NotaDeCargo)session.get(NotaDeCargo.class, id);
                res.getCliente().getTelefonosRow();
                return res;
            }            
        }
        );
    }

    public static Map resolverParametros(NotaDeCargo nota, ComprobanteFiscal cf)
    {
        if(cf == null)
            cf = buscarComprobante(nota.getId());
        cf.loadComprobante();
        mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante comprobante = cf.getComprobante();
        Map parametros = new HashMap();
        parametros.put("FOLIO", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append("-").append(comprobante.getFolio()).toString());
        parametros.put("ANO_APROBACION", Integer.valueOf(comprobante.getAnoAprobacion()));
        parametros.put("NO_APROBACION", Integer.valueOf(comprobante.getNoAprobacion().intValue()));
        parametros.put("NUM_CERTIFICADO", comprobante.getNoCertificado());
        parametros.put("SELLO_DIGITAL", comprobante.getSello());
        parametros.put("CADENA_ORIGINAL", getCadenaOriginal(cf.getComprobanteDocument()));
        parametros.put("NOMBRE", comprobante.getReceptor().getNombre());
        parametros.put("RFC", comprobante.getReceptor().getRfc());
        parametros.put("FECHA", comprobante.getFecha().getTime());
        parametros.put("NFISCAL", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append(" - ").append(comprobante.getFolio()).toString());
        parametros.put("IMPORTE", comprobante.getSubTotal());
        parametros.put("IMPUESTO", comprobante.getImpuestos().getTotalImpuestosTrasladados());
        parametros.put("TOTAL", comprobante.getTotal());
        parametros.put("DIRECCION", CFDUtils.getDireccionEnFormatoEstandar(comprobante.getReceptor().getDomicilio()));
        parametros.put("CARGO_ID", nota.getId());
        parametros.put("IMP_CON_LETRA", ImporteALetra.aLetra(nota.getTotalCM()));
        parametros.put("SUCURSAL", nota.getSucursal().getId());
        parametros.put("CLAVCTE", nota.getClave());
        parametros.put("SUC", Integer.valueOf(nota.getSucursal().getClave()));
        parametros.put("TEL", nota.getCliente().getTelefonosRow());
        parametros.put("D_REV", Integer.valueOf(nota.getDiaRevision()));
        parametros.put("D_PAG", Integer.valueOf(nota.getDiaDelPago()));
        parametros.put("COB", nota.getCobrador() == null ? null : ((Object) (nota.getCobrador().getId())));
        parametros.put("PLAZO", Integer.valueOf(nota.getPlazo()));
        parametros.put("FREV", nota.isRevision() ? "R" : "");
        parametros.put("TIPO", nota.getOrigen().equals(OrigenDeOperacion.CRE) ? "CREDITO" : "CONTADO");
        parametros.put("DOCTO", nota.getDocumento());
        parametros.put("TAR_COM_IMP", nota.getCargos());
        parametros.put("COMENTARIO", nota.getComentario());
        parametros.put("ELAB_FAC", nota.getLog().getCreateUser());
        return parametros;
    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable() {

            public void run()
            {
                SWExtUIManager.setup();
                CFDPrintServices_old.imprimirNotaDeCargoElectronica("8a8a81c7-2c99f8f4-012c-99f98cd4-0001");
                System.exit(0);
            }

        }
);
    }
}
